#ifndef eth_COMMON_H
#define eth_COMMON_H

#include <string.h>
#include <stdlib.h>
// #include "xparameters.h"

typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef int s32;
#define UINTPTR u32



#ifndef TRUE
#  define TRUE		1U
#endif

#ifndef FALSE
#  define FALSE		0U
#endif

#ifndef NULL
#define NULL		((void*)0)
#endif

#define XLLF_INT_RPURE_MASK       0x80000000 /**< Receive under-read */
#define XLLF_INT_RPORE_MASK       0x40000000 /**< Receive over-read */
#define XLLF_INT_RPUE_MASK        0x20000000 /**< Receive underrun (empty) */
#define XLLF_INT_TPOE_MASK        0x10000000 /**< Transmit overrun */
#define XLLF_INT_TC_MASK          0x08000000 /**< Transmit complete */
#define XLLF_INT_RC_MASK          0x04000000 /**< Receive complete */
#define XLLF_INT_TSE_MASK         0x02000000 /**< Transmit length mismatch */
#define XLLF_INT_TRC_MASK         0x01000000 /**< Transmit reset complete */
#define XLLF_INT_RRC_MASK         0x00800000 /**< Receive reset complete */
#define XLLF_INT_TFPF_MASK        0x00400000 /**< Tx FIFO Programmable Full,
						* AXI FIFO MM2S Only */
#define XLLF_INT_TFPE_MASK        0x00200000 /**< Tx FIFO Programmable Empty
						* AXI FIFO MM2S Only */
#define XLLF_INT_RFPF_MASK        0x00100000 /**< Rx FIFO Programmable Full
						* AXI FIFO MM2S Only */
#define XLLF_INT_RFPE_MASK        0x00080000 /**< Rx FIFO Programmable Empty
						* AXI FIFO MM2S Only */
#define XLLF_INT_ALL_MASK         0xfff80000 /**< All the ints */
#define XLLF_INT_ERROR_MASK       0xf2000000 /**< Error status ints */
#define XLLF_INT_RXERROR_MASK     0xe0000000 /**< Receive Error status ints */
#define XLLF_INT_TXERROR_MASK     0x12000000 /**< Transmit Error status ints */

#define SYS_MODE_WORK (0x2B)   // 观测模式
#define SYS_MODE_IDLE (0x17)   // 待机
#define SYS_MODE_UPDATE (0x64) // 在轨更新
#define SYS_MODE_TEST (0x75)   // 自校模式

#define XPAR_INTC_0_LLFIFO_0_VEC_ID 0
#define XPAR_INTC_0_LLFIFO_1_VEC_ID 1


#define IPV6_TYPE ((u16)0x86DD)
#define UDP_PROTOCOL ((u8)17)
#define ICMPV6_PROTOCOL ((u8)58)

#define ETH_HEADER_SIZE 14
#define IPV6_HEADER_SIZE 40
#define UDP_HEADER_SIZE 8
#define ICMP_HEADER_SIZE 8

#define IPV6_HEADER_LOC 14
#define UDP_HEADER_LOC 54      // 14+40 ETH_HEADER_SIZE+IPV6_HEADER_SIZE
#define ICMP_HEADER_LOC 54     // 14+40 ETH_HEADER_SIZE+IPV6_HEADER_SIZE
#define APP_HEADER_LOC 62      // 14+40+8 ETH_HEADER_SIZE+IPV6_HEADER_SIZE+UDP_HEADER_SIZE
#define APP_VCDU_HEADER_LOC 66 // APP_HEADER_LOC + 4
#define APP_VCDU_DATA_LOC 104  // APP_VCDU_HEADER_LOC + 38

#define PROGRAM_UPDATE_DONE (0xAA)      // 程序更新完成标志位
#define PROGRAM_UPDATING (0x99)         // 程序正在更新标志位
#define PROGRAM_UPDATE_ERASE_OK (0xBB)  // 扇区擦除完成
#define PROGRAM_UPDATE_ERASE_ERR (0xCC) // 扇区擦除失败
#define PROGRAM_UPDATE_CRC_ERR (0x11)   // CRC错误
#define PROGRAM_UPDATE_WRONG_CNT (0x22) // 计数不连续
#define PROGRAM_UPDATE_AOS_ERR (0x33)   // AOS数据类型标识错

#define XAE_MAC_ADDR_SIZE		6	/* MAC addresses are 6 bytes */

typedef unsigned char EthernetFrame[1518];




typedef struct XLlFifo {
	UINTPTR BaseAddress;  /**< BaseAddress is the physical base address of the
	                   *   device's registers
	                   */

	u32 IsReady;           /**< IsReady is non-zero if the driver instance
	                        *   has been initialized.
	                        */

	u32 Axi4BaseAddress;	/**< BaseAddress if the FIFO Data interface is
				 *	AXI4 this address should use for FIFO
				 *	access
				 */
	u32 Datainterface;	/**< Data interface of the FIFO. This value is zero
				 *	if the Datainterface is AXI4-lite.
				 */
	u32 RxStreamer; /**< RxStreamer is the byte streamer
	                                  *   instance for the receive channel.
	                                  */
	u32 TxStreamer; /**< TxStreamer is the byte streamer
	                                  *   instance for the transmit channel.
	                                  */
} XLlFifo;


typedef struct Eth_status_cnt
{
    u16 FramesRx;          // FIFO模块 接收计数
    u16 FramesTx;          // FIFO模块 发送计数
    u32 rx_flag;           // 已收到待处理的次数
    u32 FifoErrCode;       // FIFO错误码
    u32 EthErrCode;        // 以太网模块错误码
    u16 update_status;       // 程序更新状态 更新中或者更新完成
    u16 update_expect_cnt; // 程序更新包 预期接收计数 从0开始
} Eth_status_cnt;




// 定义网口配置参数结构体，方便扩展和维护
// typedef struct EthConfig
// {
//     u16 deviceId;
//     XAxiEthernet *ethInstancePtr;
//     XLlFifo *fifoInstancePtr;
// } EthConfig;

// 以太网数据帧定义
#pragma pack(push, 1) // 禁用结构体内存对齐
// 以太网帧头（14字节）
typedef struct eth_header
{
    u8 dst_mac[6];  // 目标MAC地址
    u8 src_mac[6];  // 源MAC地址
    u16 ether_type; // 以太网类型（IPv6为0x86DD）
} eth_header;

// IPv6头部（40字节）
typedef struct ipv6_header
{
    u32 ver_tc_fl;     // 版本(4bit) + 流量类别(8bit) + 流标签(20bit)
    u16 payload_len;   // 有效载荷长度（IPv6头之后的数据长度）
    u8 next_header;    // 下一个头部类型 ICMPv6为58 UDP为17
    u8 hop_limit;      // 跳数限制
    u8 src_ipaddr[16]; // 源IPv6地址
    u8 dst_ipaddr[16]; // 目的IPv6地址
} ipv6_header;

// ICMPv6回显请求报文（基本头+数据）
typedef struct icmpv6_msg
{
    u8 type;            // 类型（128=请求，129=应答）
    u8 code;            // 代码（0）
    u16 checksum;       // 校验和
    u16 identifier;     // 标识符
    u16 sequence;       // 序列号
    u8 icmpv6_data[64]; // 可变长度数据
} icmpv6_msg;

// UDP头部结构
typedef struct udp_header
{
    u16 src_port;
    u16 dst_port;
    u16 length; // UDP数据报长度
    u16 checksum;
} udp_header;

typedef struct app_header // AOS帧头 数据类型标识
{
    u16 protocol_type; // 应用协议类型 高字节00 低字节AA
    u8 data_type;      //  应用数据类型  0x03--像制保证数据 0x01--在轨维护数据帧
    u8 port;           // 文件传输端口号 VCID  0x29--在轨维护数据帧  0x14--大气校正仪数据
} app_header;

typedef struct app_vcdu_header
{
    u16 header;     // 版本号 标识符 等 0x5C54
    u8 cnt_padding; // VCDU计数器高字节 填充 0
    u16 VCDU_cnt;   //  VCDU计数器 中低2个字节 从0开始
    u8 mark;        // 标志域 0x00
    u8 padding[32]; // 填充数据
} app_vcdu_header;

typedef struct app_vcdu_data
{
    u32 RS_hdr;        // 遥感数据帧头 0x40000A63
    u16 RS_cnt;        // 遥感数据包计数 从0开始
    u32 RS_mark;       // 遥感数据标识 0xFFFFFFFF
    u16 sat_time[4];   // 整星时间码
    u32 uS_count;      // 秒内计数 单位 微秒
    u8 RS_data[300];   // 遥感数据
    u32 padding1;      // 填充分隔 0xFFFFFFFF
    u8 temperature[8]; // 主体温度 串口获取 8字节
    u8 cloud_res[8];   // 云判结果
    u16 cloud_sum;     // 云判累加和
    u8 padding2[16];   // 填充分隔
    u8 alt[210];       // 姿态数据 加头加尾 208+2
    u32 padding3;      // 填充分隔 0xFFFFFFFF
    // u8 pos_and_para[212]; // 定位和任务参数数据 加头加尾 210+2
    u8 pos_and_para[220]; // 定位和任务参数数据 加头加尾 210+2
    u32 padding4;         // 填充分隔 0xFFFFFFFF
    u32 timer_capture[2]; // 64位定时器的值
    u8 rsv[46]; // 保留字段
    u16 crc;    // 校验码 2字节
} app_vcdu_data;

typedef struct app_vcdu_prog // 在轨维护包结构体
{
    u16 bpdu_header;         // 导头 高2bit为 01--首帧 00--中间 10--帧尾
                             // 低14bit 长度 3FFF 表示长度全有效
    u8 bitstream_mark;       // 位流标识  载荷方定义
    u32 bitstream_cnt;       // 位流计数 载荷方定义
    u8 padding1[5];          // 填充5字节
    u8 bit_stream_data[539]; // 比特流数据
    u8 padding2[301];        // 填充字节
    u16 crc;                 // 校验码 2字节
} app_vcdu_prog;

typedef struct upd_payload // UDP载荷 即全部应用层数据
{
    struct app_header header;
    struct app_vcdu_header vcdu_header;
    struct app_vcdu_data vcdu_data;
} upd_payload;

typedef struct vcdu_frame // VCDU数据单元格式结构体
{
    struct app_vcdu_header vcdu_header;
    struct app_vcdu_data vcdu_data;
} vcdu_frame;

typedef struct eth_upd_frame // UDP报文总结构体 用于计算长度
{
    struct eth_header header;
    struct ipv6_header ipv6_header;
    struct udp_header udp_header;
    struct upd_payload udp_payload;
} eth_upd_frame;

typedef struct eth_icmpv6_frame // ICMPV6报文总结构体 用于计算长度
{
    struct eth_header header;
    struct ipv6_header ipv6_header;
    struct icmpv6_msg icmpv6_msg;
} eth_icmpv6_frame;

#pragma pack(pop) // 恢复默认内存对齐



u32 XLlFifo_RxOccupancy(XLlFifo *InstancePtr);
u32 XLlFifo_RxGetLen(XLlFifo *InstancePtr);
void XLlFifo_Read(XLlFifo *InstancePtr, void *BufPtr, u32 Bytes);
u32 XLlFifo_IntPending(XLlFifo *InstancePtr);
u32 B1553_get_current_mode();
void XLlFifo_RxReset(XLlFifo *InstancePtr);
void XLlFifo_IntClear(XLlFifo *InstancePtr, u32 Mask);
void XIntc_Acknowledge(u32 *InstancePtr, u8 Id);


void eth_ICMPv6Frame_init(EthernetFrame *FramePtr);
u16 transLayer_checksum(const EthernetFrame *FramePtr);

u32 Xil_Htons(u32 sum);
int eth_FifoTransData(u32 *FifoPtr, EthernetFrame *FramePtr, u32 TxFrameLength);


void B1553_TMadd_Comm_Eth_TX_Count(u32 *pBusServ);
void B1553_TMadd_Comm_Update_Error_Count(u32 *pBusServ);
void B1553_TMset_Update_stat(u32 *pBusServ, u8 stat);

void uart_rs01_send(u8 *data, u32 len);
void B1553_TMadd_Comm_Update_Count(u32 *pBusServ);

void uart_rs01_sendTM(void);
void uart_rs01_rcvTM(void);
#endif